import type { ConfigItem } from '@/api/types'
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { getAllConfigs } from '@/api/config'

// 定义配置store
export const useConfigStore = defineStore('config', () => {
  // 配置数据
  const configs = ref<ConfigItem[]>([])
  // 配置加载状态
  const configsLoaded = ref(false)
  // 当前页码
  const currentPage = ref(1)
  // 每页数量
  const pageSize = ref(10)
  // 总记录数
  const total = ref(0)

  /**
   * 初始化配置
   * 从服务器获取配置并保存到store
   * @param page 页码
   * @param limit 每页数量
   */
  async function initConfigs(page: number = currentPage.value, limit: number = pageSize.value) {
    try {
      // 从服务器获取配置（带分页）
      const response = await getAllConfigs(page, limit)
      if (response.statusCode === 200 && response.data) {
        // 保存到store
        configs.value = response.data
        // 更新总记录数
        total.value = response.total || 0
        // 更新当前页码
        currentPage.value = page
        // 更新每页数量
        pageSize.value = limit
        // 设置加载状态为true
        configsLoaded.value = true
      }
    } catch (error) {
      console.error('Failed to load configs:', error)
    }
  }

  /**
   * 获取所有配置
   * @returns 配置数组
   */
  function getAllConfigItems(): ConfigItem[] {
    return configs.value
  }

  /**
   * 根据键名获取配置值
   * @param key 配置键名
   * @returns 配置值
   */
  function getConfigValueByKey(key: string): any {
    const config = configs.value.find((item) => item.key === key)
    return config ? config.value : null
  }

  /**
   * 根据键名获取完整配置项
   * @param key 配置键名
   * @returns 配置项
   */
  function getConfigByKey(key: string): ConfigItem | null {
    return configs.value.find((item) => item.key === key) || null
  }

  /**
   * 刷新配置
   * 从服务器重新获取配置并更新
   * @param page 可选，指定刷新的页码
   */
  async function refreshConfigs(page?: number) {
    // 重置加载状态
    configsLoaded.value = false
    // 重新加载配置
    await initConfigs(page || currentPage.value, pageSize.value)
  }

  /**
   * 切换页码
   * @param page 目标页码
   */
  async function changePage(page: number) {
    if (page > 0 && page !== currentPage.value) {
      await initConfigs(page, pageSize.value)
    }
  }

  /**
   * 更改每页数量
   * @param limit 每页数量
   */
  async function changePageSize(limit: number) {
    if (limit > 0 && limit !== pageSize.value) {
      pageSize.value = limit
      await initConfigs(1, limit) // 重置到第一页
    }
  }

  return {
    configs,
    configsLoaded,
    currentPage,
    pageSize,
    total,
    initConfigs,
    getAllConfigItems,
    getConfigValueByKey,
    getConfigByKey,
    refreshConfigs,
    changePage,
    changePageSize,
  }
})
